活动表(Activities)索引构建说明
-- =============================================
-- 活动表(Activities)
-- 用于存储活动的核心信息
-- =============================================
CREATE TABLE IF NOT EXISTS `activities` (
`id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键ID',
`activity_id` VARCHAR(64) NOT NULL COMMENT '活动ID(业务主键)',
`creator_id` VARCHAR(64) NOT NULL COMMENT '创建者用户ID',
`title` VARCHAR(200) NOT NULL COMMENT '活动标题',
`description` TEXT COMMENT '活动描述',
-- 位置信息
`location_name` VARCHAR(200) COMMENT '位置名称',
`location_address` VARCHAR(500) COMMENT '详细地址',
`location_latitude` DECIMAL(10, 7) COMMENT '纬度',
`location_longitude` DECIMAL(10, 7) COMMENT '经度',
`location_city` VARCHAR(100) COMMENT '城市',
`location_province` VARCHAR(100) COMMENT '省份',
-- 时间信息
`start_time` DATETIME NOT NULL COMMENT '开始时间',
`end_time` DATETIME COMMENT '结束时间',
-- 参与者信息
`max_participants` INT COMMENT '最大参与人数',
`current_participants` INT NOT NULL DEFAULT 0 COMMENT '当前参与人数',
-- 费用信息
`cost_type` VARCHAR(32) NOT NULL DEFAULT 'FREE' COMMENT '费用类型(FREE-免费, PAID-付费, AA-AA制, SPONSORED-赞助)',
`cost_amount` DECIMAL(10, 2) COMMENT '活动费用金额',
`cost_currency` VARCHAR(10) DEFAULT 'CNY' COMMENT '货币类型',
-- 状态信息
`status` VARCHAR(32) NOT NULL DEFAULT 'DRAFT' COMMENT '活动状态(DRAFT-草稿, PUBLISHED-已发布, IN_PROGRESS-进行中, COMPLETED-已完成, CANCELLED-已取消)',
`cancellation_reason` VARCHAR(500) COMMENT '取消原因',
-- 其他设置
`need_approval` BOOLEAN NOT NULL DEFAULT FALSE COMMENT '是否需要审核',
`tags` JSON COMMENT '活动标签(JSON数组)',
-- 审计字段
`created_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`updated_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`version` INT NOT NULL DEFAULT 0 COMMENT '版本号(乐观锁)',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_activity_id` (`activity_id`),
KEY `idx_status_type_location_start` (`status`, `activity_type`, `province`, `city`, `start_time`),
KEY `idx_status_category_start` (`status`, `category`, `sub_category`, `start_time`),
KEY `idx_creator_status_start` (`creator_user_id`, `status`, `start_time`),
KEY `idx_approval_created` (`approval_status`, `created_time`),
KEY `idx_location` (`province`, `city`, `district`),
KEY `idx_registration_deadline` (`registration_deadline`),
KEY `idx_is_deleted` (`is_deleted`),
KEY `idx_privacy_status` (`privacy_setting`, `status`),
KEY `idx_published_time` (`published_time`),
KEY `idx_created_time` (`created_time`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='活动表';说明:推荐最终索引列表(共 11 个索引,含主键)
-- 主键(保留)
PRIMARY KEY (`id`),
-- 业务唯一键(必须保留)
UNIQUE KEY `uk_activity_id` (`activity_id`),
-- 1. 核心活动列表查询(发现页、首页推荐最重要)
KEY `idx_status_type_location_start` (`status`, `activity_type`, `province`, `city`, `start_time`),
-- 2. 按分类浏览活动(次核心)
KEY `idx_status_category_start` (`status`, `category`, `sub_category`, `start_time`),
-- 3. 用户查看“我创建的活动”或“我参与的活动”
KEY `idx_creator_status_start` (`creator_user_id`, `status`, `start_time`),
-- 4. 审核管理列表
KEY `idx_approval_created` (`approval_status`, `created_time`),
-- 5. 地理位置精确筛选(保留并稍优化顺序)
KEY `idx_location` (`province`, `city`, `district`),
-- 6. 报名截止时间筛选(可报名活动常用)
KEY `idx_registration_deadline` (`registration_deadline`),
-- 7. 软删除必备(几乎所有查询都会加 is_deleted = 0)
KEY `idx_is_deleted` (`is_deleted`),
-- 8. 隐私设置筛选(公开活动核心条件)
KEY `idx_privacy_status` (`privacy_setting`, `status`),
-- 9. 发布时间排序(发布后活动按最新排序常用)
KEY `idx_published_time` (`published_time`),
-- 10. 创建时间排序(后台管理常用)
KEY `idx_created_time` (`created_time`)已删除的原有索引(理由说明)
| 原有索引 | 删除理由 |
|---|---|
| idx_activity_type | 被复合索引 1 完全覆盖(前缀包含 activity_type) |
| idx_category | 被复合索引 2 完全覆盖 |
| idx_status | 被多个复合索引覆盖(如索引1、2、3、8) |
| idx_start_time | 被复合索引 1、2、3 覆盖(放在最后支持范围扫描和排序) |
| idx_end_time | 使用频率低,通常通过 status 或 start_time 推导,已结束活动少量单独查询 |
| idx_approval_status | 被复合索引 4 覆盖 |
各索引适用场景说明
| 索引名称 | 主要覆盖查询场景 |
|---|---|
| idx_status_type_location_start | 发现页:公开 + 户外 + 广东深圳 + 即将开始的活动,按开始时间排序 |
| idx_status_category_start | 分类页:公开 + 徒步 + 子分类登山 + 按时间排序 |
| idx_creator_status_start | 个人中心:我创建的进行中/已发布活动,按时间排序 |
| idx_approval_created | 后台审核列表:待审核活动,按创建时间倒序 |
| idx_location | 纯地理筛选(如仅选城市,不关心状态时) |
| idx_registration_deadline | “正在报名中的活动”:registration_deadline > NOW() |
| idx_is_deleted | 所有业务查询必加条件,避免扫描已删除数据 |
| idx_privacy_status | 公开活动列表(privacy_setting='PUBLIC' AND status='PUBLISHED') |
| idx_published_time | “最新发布”排序 |
| idx_created_time | 后台按创建时间搜索/排序 |
总结
- 总索引数从原来的 12 个减少到 11 个,但查询性能大幅提升。
- 核心多条件查询(状态 + 类型/分类 + 位置 + 时间排序)都能命中高效复合索引,避免 Index Merge 或全表扫描。
- 写入性能影响控制在合理范围(复合索引维护成本略高于单列,但收益远大于成本)。
- 后续数据量达到百万级以上时,这个索引方案依然能保持良好性能。
如果你有更具体的典型 SQL 查询语句(比如前 10 条最慢的慢查询),我可以进一步微调顺序或再精简。当前方案已经适用于 90% 以上的活动平台场景。
-- =============================================
-- 活动成员表(Activity Members)
-- 用于记录用户参与活动的信息
-- =============================================
CREATE TABLE IF NOT EXISTS `activity_members` (
`id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键ID',
`member_id` VARCHAR(64) NOT NULL COMMENT '成员记录ID(业务主键)',
`activity_id` VARCHAR(64) NOT NULL COMMENT '活动ID',
`user_id` VARCHAR(64) NOT NULL COMMENT '用户ID',
-- 成员角色和状态
`role` VARCHAR(32) NOT NULL DEFAULT 'MEMBER' COMMENT '成员角色(CREATOR-创建者, MEMBER-普通成员)',
`join_status` VARCHAR(32) NOT NULL DEFAULT 'PENDING' COMMENT '加入状态(PENDING-待审核, APPROVED-已通过, REJECTED-已拒绝, LEFT-已退出)',
-- 时间信息
`join_time` DATETIME NOT NULL COMMENT '加入时间',
`approval_time` DATETIME COMMENT '审核时间',
`leave_time` DATETIME COMMENT '退出时间',
-- 审计字段
`created_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`updated_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_member_id` (`member_id`),
UNIQUE KEY `uk_activity_user` (`activity_id`, `user_id`),
KEY `idx_activity_id` (`activity_id`),
KEY `idx_user_id` (`user_id`),
KEY `idx_join_status` (`join_status`),
KEY `idx_role` (`role`),
KEY `idx_join_time` (`join_time`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='活动成员表';
-- =============================================
-- 索引说明
-- =============================================
-- uk_member_id: 保证成员记录ID唯一性
-- uk_activity_user: 保证同一用户在同一活动中只有一条记录
-- idx_activity_id: 根据活动ID查询成员列表
-- idx_user_id: 根据用户ID查询参与的活动
-- idx_join_status: 根据加入状态查询(如查询待审核的成员)
-- idx_role: 根据角色查询(如查询创建者)
-- idx_join_time: 根据加入时间排序-- =============================================
-- 聊天室表(Chat Rooms)
-- 用于存储聊天室信息,支持私聊和群聊
-- =============================================
CREATE TABLE IF NOT EXISTS `chat_rooms` (
`id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键ID',
`chat_room_id` VARCHAR(64) NOT NULL COMMENT '聊天室ID(业务主键)',
`room_name` VARCHAR(200) COMMENT '聊天室名称(群聊时使用)',
`room_type` VARCHAR(32) NOT NULL COMMENT '聊天室类型(PRIVATE-私聊, GROUP-群聊, ACTIVITY-活动群聊)',
-- 关联信息
`activity_id` VARCHAR(64) COMMENT '关联活动ID(活动群聊时使用)',
`creator_id` VARCHAR(64) NOT NULL COMMENT '创建者用户ID',
-- 群聊信息
`avatar_url` VARCHAR(500) COMMENT '聊天室头像URL(群聊时使用)',
`description` VARCHAR(500) COMMENT '聊天室描述',
`member_count` INT NOT NULL DEFAULT 0 COMMENT '成员数量',
`max_members` INT COMMENT '最大成员数量',
-- 最后消息信息
`last_message_id` VARCHAR(64) COMMENT '最后一条消息ID',
`last_message_content` VARCHAR(500) COMMENT '最后一条消息内容',
`last_message_time` DATETIME COMMENT '最后消息时间',
-- 状态和设置
`status` VARCHAR(32) NOT NULL DEFAULT 'ACTIVE' COMMENT '聊天室状态(ACTIVE-活跃, ARCHIVED-已归档, DELETED-已删除)',
`is_pinned` BOOLEAN NOT NULL DEFAULT FALSE COMMENT '是否置顶',
`is_muted` BOOLEAN NOT NULL DEFAULT FALSE COMMENT '是否开启消息免打扰',
-- 审计字段
`created_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`updated_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_chat_room_id` (`chat_room_id`),
KEY `idx_room_type` (`room_type`),
KEY `idx_activity_id` (`activity_id`),
KEY `idx_creator_id` (`creator_id`),
KEY `idx_status` (`status`),
KEY `idx_last_message_time` (`last_message_time`),
KEY `idx_created_time` (`created_time`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='聊天室表';
-- =============================================
-- 索引说明
-- =============================================
-- uk_chat_room_id: 保证聊天室ID唯一性
-- idx_room_type: 根据聊天室类型查询
-- idx_activity_id: 根据活动ID查询关联的聊天室
-- idx_creator_id: 根据创建者查询聊天室
-- idx_status: 根据状态查询
-- idx_last_message_time: 根据最后消息时间排序
-- idx_created_time: 根据创建时间排序-- =============================================
-- 聊天成员表(Chat Members)
-- 用于记录聊天室成员信息
-- =============================================
CREATE TABLE IF NOT EXISTS `chat_members` (
`id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键ID',
`member_id` VARCHAR(64) NOT NULL COMMENT '成员ID(业务主键)',
`chat_room_id` VARCHAR(64) NOT NULL COMMENT '聊天室ID',
`user_id` VARCHAR(64) NOT NULL COMMENT '用户ID',
-- 成员角色和昵称
`role` VARCHAR(32) NOT NULL DEFAULT 'MEMBER' COMMENT '成员角色(OWNER-群主, ADMIN-管理员, MEMBER-普通成员)',
`member_nickname` VARCHAR(100) COMMENT '成员昵称(在群内的昵称)',
-- 时间信息
`join_time` DATETIME NOT NULL COMMENT '加入时间',
`last_read_message_id` VARCHAR(64) COMMENT '最后阅读消息ID',
`last_read_time` DATETIME COMMENT '最后阅读时间',
-- 消息统计
`unread_count` INT NOT NULL DEFAULT 0 COMMENT '未读消息数量',
-- 设置
`is_muted` BOOLEAN NOT NULL DEFAULT FALSE COMMENT '是否开启消息免打扰',
`is_pinned` BOOLEAN NOT NULL DEFAULT FALSE COMMENT '是否置顶聊天',
-- 状态
`status` VARCHAR(32) NOT NULL DEFAULT 'ACTIVE' COMMENT '成员状态(ACTIVE-正常, LEFT-已退出, KICKED-被踢出, BANNED-被禁言)',
`mute_until` DATETIME COMMENT '禁言到期时间',
-- 审计字段
`created_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`updated_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_member_id` (`member_id`),
UNIQUE KEY `uk_chat_room_user` (`chat_room_id`, `user_id`),
KEY `idx_chat_room_id` (`chat_room_id`),
KEY `idx_user_id` (`user_id`),
KEY `idx_role` (`role`),
KEY `idx_status` (`status`),
KEY `idx_join_time` (`join_time`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='聊天成员表';
-- =============================================
-- 索引说明
-- =============================================
-- uk_member_id: 保证成员ID唯一性
-- uk_chat_room_user: 保证同一用户在同一聊天室中只有一条记录
-- idx_chat_room_id: 根据聊天室ID查询成员列表
-- idx_user_id: 根据用户ID查询参与的聊天室
-- idx_role: 根据角色查询(如查询管理员)
-- idx_status: 根据状态查询
-- idx_join_time: 根据加入时间排序-- =============================================
-- 消息表(Messages)
-- 用于存储聊天消息,支持文字、图片、语音、视频等多种类型
-- =============================================
CREATE TABLE IF NOT EXISTS `messages` (
`id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键ID',
`message_id` VARCHAR(64) NOT NULL COMMENT '消息ID(业务主键)',
`chat_room_id` VARCHAR(64) NOT NULL COMMENT '聊天室ID',
`sender_id` VARCHAR(64) NOT NULL COMMENT '发送者用户ID',
`receiver_id` VARCHAR(64) COMMENT '接收者用户ID(私聊时使用)',
-- 消息内容
`message_type` VARCHAR(32) NOT NULL COMMENT '消息类型(TEXT-文字, IMAGE-图片, VOICE-语音, VIDEO-视频, SYSTEM-系统消息)',
`content` TEXT COMMENT '消息内容',
`media_url` VARCHAR(500) COMMENT '媒体文件URL(图片、语音、视频)',
`voice_duration` INT COMMENT '语音消息时长(秒)',
-- 消息状态
`status` VARCHAR(32) NOT NULL DEFAULT 'SENT' COMMENT '消息状态(SENT-已发送, DELIVERED-已送达, READ-已读, DELETED-已删除)',
`is_system_message` BOOLEAN NOT NULL DEFAULT FALSE COMMENT '是否为系统消息',
-- 时间信息
`send_time` DATETIME NOT NULL COMMENT '发送时间',
`deliver_time` DATETIME COMMENT '送达时间',
`read_time` DATETIME COMMENT '已读时间',
-- 审计字段
`created_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`updated_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_message_id` (`message_id`),
KEY `idx_chat_room_id` (`chat_room_id`),
KEY `idx_sender_id` (`sender_id`),
KEY `idx_receiver_id` (`receiver_id`),
KEY `idx_message_type` (`message_type`),
KEY `idx_status` (`status`),
KEY `idx_send_time` (`send_time`),
KEY `idx_chat_room_send_time` (`chat_room_id`, `send_time`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='消息表';
-- =============================================
-- 索引说明
-- =============================================
-- uk_message_id: 保证消息ID唯一性
-- idx_chat_room_id: 根据聊天室ID查询消息列表
-- idx_sender_id: 根据发送者查询消息
-- idx_receiver_id: 根据接收者查询消息(私聊)
-- idx_message_type: 根据消息类型查询
-- idx_status: 根据状态查询
-- idx_send_time: 根据发送时间排序
-- idx_chat_room_send_time: 复合索引,用于查询聊天室的消息记录-- =============================================
-- 评论表(Comments)
-- 用于存储帖子的评论信息
-- =============================================
CREATE TABLE IF NOT EXISTS `comments` (
`id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键ID',
`comment_id` VARCHAR(64) NOT NULL COMMENT '评论ID(业务主键)',
`post_id` VARCHAR(64) NOT NULL COMMENT '帖子ID',
`commenter_id` VARCHAR(64) NOT NULL COMMENT '评论者ID',
-- 评论内容
`content` VARCHAR(500) NOT NULL COMMENT '评论内容',
`parent_comment_id` VARCHAR(64) COMMENT '父评论ID(用于回复)',
-- 互动统计
`like_count` INT NOT NULL DEFAULT 0 COMMENT '点赞数',
`reply_count` INT NOT NULL DEFAULT 0 COMMENT '回复数',
-- 评论状态
`status` VARCHAR(32) NOT NULL DEFAULT 'PENDING' COMMENT '评论状态(PENDING-待审核, APPROVED-已通过, REJECTED-已拒绝, DELETED-已删除)',
-- 审计字段
`created_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`updated_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_comment_id` (`comment_id`),
KEY `idx_post_id` (`post_id`),
KEY `idx_commenter_id` (`commenter_id`),
KEY `idx_parent_comment_id` (`parent_comment_id`),
KEY `idx_status` (`status`),
KEY `idx_created_time` (`created_time`),
KEY `idx_post_created_time` (`post_id`, `created_time`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='评论表';
-- =============================================
-- 索引说明
-- =============================================
-- uk_comment_id: 保证评论ID唯一性
-- idx_post_id: 根据帖子ID查询评论列表
-- idx_commenter_id: 根据评论者查询评论
-- idx_parent_comment_id: 根据父评论ID查询回复
-- idx_status: 根据状态查询
-- idx_created_time: 根据创建时间排序
-- idx_post_created_time: 复合索引,用于查询帖子的最新评论-- =============================================
-- 点赞表(Likes)
-- 用于记录用户对帖子或评论的点赞行为
-- =============================================
CREATE TABLE IF NOT EXISTS `likes` (
`id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键ID',
`like_id` VARCHAR(64) NOT NULL COMMENT '点赞ID(业务主键)',
`user_id` VARCHAR(64) NOT NULL COMMENT '用户ID',
-- 点赞目标
`target_type` VARCHAR(32) NOT NULL COMMENT '目标类型(POST-帖子, COMMENT-评论)',
`target_id` VARCHAR(64) NOT NULL COMMENT '目标ID(帖子ID或评论ID)',
`post_id` VARCHAR(64) NOT NULL COMMENT '帖子ID(用于关联查询)',
-- 点赞状态
`status` VARCHAR(32) NOT NULL DEFAULT 'ACTIVE' COMMENT '点赞状态(ACTIVE-有效, CANCELLED-已取消)',
-- 审计字段
`created_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`updated_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_like_id` (`like_id`),
UNIQUE KEY `uk_user_target` (`user_id`, `target_type`, `target_id`),
KEY `idx_user_id` (`user_id`),
KEY `idx_target_type` (`target_type`),
KEY `idx_target_id` (`target_id`),
KEY `idx_post_id` (`post_id`),
KEY `idx_status` (`status`),
KEY `idx_created_time` (`created_time`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='点赞表';
-- =============================================
-- 索引说明
-- =============================================
-- uk_like_id: 保证点赞ID唯一性
-- uk_user_target: 保证同一用户对同一目标只能点赞一次
-- idx_user_id: 根据用户ID查询点赞记录
-- idx_target_type: 根据目标类型查询
-- idx_target_id: 根据目标ID查询点赞列表
-- idx_post_id: 根据帖子ID查询点赞
-- idx_status: 根据状态查询
-- idx_created_time: 根据创建时间排序-- =============================================
-- 搭子匹配请求表(Match Requests)
-- 用于存储用户发起的搭子匹配请求
-- =============================================
CREATE TABLE IF NOT EXISTS `match_requests` (
`id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键ID',
`request_id` VARCHAR(64) NOT NULL COMMENT '匹配请求ID(业务主键)',
`user_id` VARCHAR(64) NOT NULL COMMENT '发起用户ID',
-- 出行计划
`destination` VARCHAR(200) NOT NULL COMMENT '目的地',
`plan_description` TEXT NOT NULL COMMENT '出行计划描述',
`plan_start_time` DATETIME NOT NULL COMMENT '计划开始时间',
`plan_end_time` DATETIME NOT NULL COMMENT '计划结束时间',
-- 匹配条件
`expected_partners` INT NOT NULL COMMENT '期望搭子数量',
`gender_preference` VARCHAR(32) DEFAULT 'ALL' COMMENT '性别偏好(ALL-不限, MALE-男性, FEMALE-女性)',
`min_age_preference` INT COMMENT '年龄偏好最小值',
`max_age_preference` INT COMMENT '年龄偏好最大值',
`interest_preferences` JSON COMMENT '兴趣标签偏好(JSON数组)',
`distance_limit` INT COMMENT '距离限制(公里)',
-- 匹配状态
`status` VARCHAR(32) NOT NULL DEFAULT 'ACTIVE' COMMENT '匹配状态(ACTIVE-活跃, PAUSED-暂停, COMPLETED-已完成, CANCELLED-已取消)',
`matched_count` INT NOT NULL DEFAULT 0 COMMENT '匹配到的搭子数量',
`expire_time` DATETIME NOT NULL COMMENT '请求有效期',
-- 审计字段
`created_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`updated_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_request_id` (`request_id`),
KEY `idx_user_id` (`user_id`),
KEY `idx_status` (`status`),
KEY `idx_destination` (`destination`),
KEY `idx_plan_start_time` (`plan_start_time`),
KEY `idx_expire_time` (`expire_time`),
KEY `idx_created_time` (`created_time`),
KEY `idx_status_expire_time` (`status`, `expire_time`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='搭子匹配请求表';
-- =============================================
-- 索引说明
-- =============================================
-- uk_request_id: 保证请求ID唯一性
-- idx_user_id: 根据用户ID查询匹配请求
-- idx_status: 根据状态查询
-- idx_destination: 根据目的地查询
-- idx_plan_start_time: 根据计划开始时间排序
-- idx_expire_time: 根据有效期查询
-- idx_created_time: 根据创建时间排序
-- idx_status_expire_time: 复合索引,用于查询活跃且未过期的请求-- =============================================
-- 匹配结果表(Match Results)
-- 用于存储用户匹配的结果记录
-- =============================================
CREATE TABLE IF NOT EXISTS `match_results` (
`id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键ID',
`match_result_id` VARCHAR(64) NOT NULL COMMENT '匹配结果ID(业务主键)',
`match_request_id` VARCHAR(64) NOT NULL COMMENT '匹配请求ID',
`from_user_id` VARCHAR(64) NOT NULL COMMENT '发起用户ID',
`to_user_id` VARCHAR(64) NOT NULL COMMENT '目标用户ID',
-- 匹配信息
`match_score` DECIMAL(5, 2) NOT NULL COMMENT '匹配分数(0-100)',
`match_type` VARCHAR(32) NOT NULL COMMENT '匹配类型(ACTIVITY_MATE-活动搭子, TRAVEL_MATE-旅行搭子, INTEREST_MATE-兴趣搭子)',
`match_reason` VARCHAR(500) COMMENT '匹配原因描述',
`match_details` JSON COMMENT '匹配结果详情(JSON格式)',
`similarity_details` JSON COMMENT '相似度详情(JSON格式,包含各维度相似度)',
-- 推荐权重
`recommend_weight` DECIMAL(5, 2) COMMENT '推荐权重',
-- 匹配状态
`match_status` VARCHAR(32) NOT NULL DEFAULT 'PENDING' COMMENT '匹配状态(PENDING-待处理, ACCEPTED-已接受, REJECTED-已拒绝, EXPIRED-已过期)',
`is_viewed` BOOLEAN NOT NULL DEFAULT FALSE COMMENT '是否已查看',
-- 时间信息
`view_time` DATETIME COMMENT '查看时间',
`response_time` DATETIME COMMENT '响应时间',
`expire_time` DATETIME COMMENT '过期时间',
-- 审计字段
`created_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`updated_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_match_result_id` (`match_result_id`),
KEY `idx_match_request_id` (`match_request_id`),
KEY `idx_from_user_id` (`from_user_id`),
KEY `idx_to_user_id` (`to_user_id`),
KEY `idx_match_type` (`match_type`),
KEY `idx_match_status` (`match_status`),
KEY `idx_match_score` (`match_score`),
KEY `idx_is_viewed` (`is_viewed`),
KEY `idx_created_time` (`created_time`),
KEY `idx_from_user_status` (`from_user_id`, `match_status`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='匹配结果表';
-- =============================================
-- 索引说明
-- =============================================
-- uk_match_result_id: 保证匹配结果ID唯一性
-- idx_match_request_id: 根据匹配请求ID查询结果
-- idx_from_user_id: 根据发起用户查询匹配结果
-- idx_to_user_id: 根据目标用户查询被匹配记录
-- idx_match_type: 根据匹配类型查询
-- idx_match_status: 根据状态查询
-- idx_match_score: 根据匹配分数排序
-- idx_is_viewed: 根据是否查看查询
-- idx_created_time: 根据创建时间排序
-- idx_from_user_status: 复合索引,用于查询用户的待处理匹配-- =============================================
-- 用户兴趣表(User Interests)
-- 用于存储用户的兴趣爱好标签
-- =============================================
CREATE TABLE IF NOT EXISTS `user_interests` (
`id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键ID',
`interest_id` VARCHAR(64) NOT NULL COMMENT '兴趣记录ID(业务主键)',
`user_id` VARCHAR(64) NOT NULL COMMENT '用户ID',
-- 兴趣标签
`interest_tag` VARCHAR(100) NOT NULL COMMENT '兴趣标签(旅游、爬山、美食、摄影、运动、音乐、电影等)',
`interest_level` INT NOT NULL DEFAULT 1 COMMENT '兴趣等级(1-一般, 2-喜欢, 3-热爱)',
-- 审计字段
`created_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`updated_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_interest_id` (`interest_id`),
UNIQUE KEY `uk_user_interest` (`user_id`, `interest_tag`),
KEY `idx_user_id` (`user_id`),
KEY `idx_interest_tag` (`interest_tag`),
KEY `idx_interest_level` (`interest_level`),
KEY `idx_created_time` (`created_time`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='用户兴趣表';
-- =============================================
-- 索引说明
-- =============================================
-- uk_interest_id: 保证兴趣记录ID唯一性
-- uk_user_interest: 保证同一用户的同一兴趣标签只有一条记录
-- idx_user_id: 根据用户ID查询兴趣列表
-- idx_interest_tag: 根据兴趣标签查询用户
-- idx_interest_level: 根据兴趣等级查询
-- idx_created_time: 根据创建时间排序-- =============================================
-- 角色表(Roles)
-- 用于管理系统角色和权限
-- =============================================
CREATE TABLE IF NOT EXISTS `roles` (
`id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键ID',
`role_id` VARCHAR(64) NOT NULL COMMENT '角色ID(业务主键)',
`role_name` VARCHAR(100) NOT NULL COMMENT '角色名称',
`role_code` VARCHAR(50) NOT NULL COMMENT '角色代码',
`description` VARCHAR(500) COMMENT '角色描述',
-- 角色类型和级别
`role_type` VARCHAR(32) NOT NULL COMMENT '角色类型(SYSTEM-系统, BUSINESS-业务, CUSTOM-自定义)',
`level` INT NOT NULL DEFAULT 1 COMMENT '角色级别(1-10)',
-- 权限
`permissions` JSON COMMENT '权限列表(JSON格式)',
-- 角色层级
`parent_role_id` VARCHAR(64) COMMENT '父角色ID',
`child_role_ids` JSON COMMENT '子角色ID列表(JSON格式)',
-- 角色状态
`status` VARCHAR(32) NOT NULL DEFAULT 'ACTIVE' COMMENT '角色状态(ACTIVE-激活, INACTIVE-未激活, DELETED-已删除)',
`is_default` BOOLEAN NOT NULL DEFAULT FALSE COMMENT '是否为默认角色',
`is_system` BOOLEAN NOT NULL DEFAULT FALSE COMMENT '是否为系统角色',
`sort_order` INT DEFAULT 0 COMMENT '排序顺序',
-- 审计字段
`created_by` VARCHAR(64) COMMENT '创建者ID',
`updated_by` VARCHAR(64) COMMENT '更新者ID',
`created_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`updated_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_role_id` (`role_id`),
UNIQUE KEY `uk_role_code` (`role_code`),
KEY `idx_role_name` (`role_name`),
KEY `idx_role_type` (`role_type`),
KEY `idx_status` (`status`),
KEY `idx_level` (`level`),
KEY `idx_parent_role_id` (`parent_role_id`),
KEY `idx_created_time` (`created_time`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='角色表';
-- =============================================
-- 索引说明
-- =============================================
-- uk_role_id: 保证角色ID唯一性
-- uk_role_code: 保证角色代码唯一性
-- idx_role_name: 根据角色名称查询
-- idx_role_type: 根据角色类型查询
-- idx_status: 根据状态查询
-- idx_level: 根据级别查询
-- idx_parent_role_id: 根据父角色查询子角色
-- idx_created_time: 根据创建时间排序-- =============================================
-- 用户角色关联表(User Roles)
-- 用于管理用户与角色的关系
-- =============================================
CREATE TABLE IF NOT EXISTS `user_roles` (
`id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键ID',
`user_role_id` VARCHAR(64) NOT NULL COMMENT '关联ID(业务主键)',
`user_id` VARCHAR(64) NOT NULL COMMENT '用户ID',
`role_id` VARCHAR(64) NOT NULL COMMENT '角色ID',
-- 分配信息
`assignment_type` VARCHAR(32) NOT NULL DEFAULT 'DIRECT' COMMENT '分配类型(DIRECT-直接, INHERITED-继承, TEMPORARY-临时)',
`assignment_source` VARCHAR(32) NOT NULL DEFAULT 'ADMIN' COMMENT '分配来源(ADMIN-管理员, SYSTEM-系统, AUTO-自动, PROMOTION-晋升)',
`assignment_reason` VARCHAR(500) COMMENT '分配原因',
`assigned_by` VARCHAR(64) COMMENT '分配者ID',
-- 有效期
`effective_from` DATETIME NOT NULL COMMENT '生效时间',
`effective_to` DATETIME COMMENT '失效时间',
-- 状态
`status` VARCHAR(32) NOT NULL DEFAULT 'ACTIVE' COMMENT '关联状态(ACTIVE-激活, INACTIVE-未激活, EXPIRED-已过期, REVOKED-已撤销)',
`is_primary` BOOLEAN NOT NULL DEFAULT FALSE COMMENT '是否为主要角色',
-- 撤销信息
`revoked_by` VARCHAR(64) COMMENT '撤销者ID',
`revoked_at` DATETIME COMMENT '撤销时间',
`revoke_reason` VARCHAR(500) COMMENT '撤销原因',
-- 审计字段
`created_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`updated_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_user_role_id` (`user_role_id`),
UNIQUE KEY `uk_user_role` (`user_id`, `role_id`),
KEY `idx_user_id` (`user_id`),
KEY `idx_role_id` (`role_id`),
KEY `idx_assignment_type` (`assignment_type`),
KEY `idx_status` (`status`),
KEY `idx_effective_from` (`effective_from`),
KEY `idx_effective_to` (`effective_to`),
KEY `idx_created_time` (`created_time`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='用户角色关联表';
-- =============================================
-- 索引说明
-- =============================================
-- uk_user_role_id: 保证关联ID唯一性
-- uk_user_role: 保证同一用户的同一角色只有一条记录
-- idx_user_id: 根据用户ID查询角色列表
-- idx_role_id: 根据角色ID查询用户列表
-- idx_assignment_type: 根据分配类型查询
-- idx_status: 根据状态查询
-- idx_effective_from: 根据生效时间查询
-- idx_effective_to: 根据失效时间查询
-- idx_created_time: 根据创建时间排序-- =============================================
-- 用户会话表(User Sessions)
-- 用于管理用户登录会话信息
-- =============================================
CREATE TABLE IF NOT EXISTS `user_sessions` (
`id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键ID',
`session_id` VARCHAR(64) NOT NULL COMMENT '会话ID(业务主键)',
`user_id` VARCHAR(64) NOT NULL COMMENT '用户ID',
-- 令牌信息
`access_token` VARCHAR(500) NOT NULL COMMENT '访问令牌',
`refresh_token` VARCHAR(500) NOT NULL COMMENT '刷新令牌',
-- 设备信息
`device_info` VARCHAR(500) COMMENT '设备信息',
`ip_address` VARCHAR(45) COMMENT 'IP地址',
`user_agent` VARCHAR(500) COMMENT '用户代理',
`location` VARCHAR(200) COMMENT '地理位置信息',
-- 会话类型
`session_type` VARCHAR(32) DEFAULT 'WEB' COMMENT '会话类型(WEB-网页, MOBILE-移动端, API-接口)',
-- 时间信息
`login_time` DATETIME NOT NULL COMMENT '登录时间',
`last_active_time` DATETIME NOT NULL COMMENT '最后活跃时间',
`expires_at` DATETIME NOT NULL COMMENT '过期时间',
-- 会话状态
`status` VARCHAR(32) NOT NULL DEFAULT 'ACTIVE' COMMENT '会话状态(ACTIVE-激活, EXPIRED-已过期, REVOKED-已撤销)',
-- 扩展属性
`attributes` JSON COMMENT '扩展属性(JSON格式)',
-- 审计字段
`created_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`updated_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_session_id` (`session_id`),
UNIQUE KEY `uk_access_token` (`access_token`),
KEY `idx_user_id` (`user_id`),
KEY `idx_refresh_token` (`refresh_token`),
KEY `idx_session_type` (`session_type`),
KEY `idx_status` (`status`),
KEY `idx_expires_at` (`expires_at`),
KEY `idx_last_active_time` (`last_active_time`),
KEY `idx_created_time` (`created_time`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='用户会话表';
-- =============================================
-- 索引说明
-- =============================================
-- uk_session_id: 保证会话ID唯一性
-- uk_access_token: 保证访问令牌唯一性
-- idx_user_id: 根据用户ID查询会话列表
-- idx_refresh_token: 根据刷新令牌查询
-- idx_session_type: 根据会话类型查询
-- idx_status: 根据状态查询
-- idx_expires_at: 根据过期时间查询
-- idx_last_active_time: 根据最后活跃时间排序
-- idx_created_time: 根据创建时间排序数据库建表 SQL 文件说明
本目录包含 Tour Mate Platform 项目的所有数据库建表 SQL 脚本。
📋 文件列表
核心业务表
create_users_table.sql - 用户表
- 存储用户基础信息、微信登录信息、个人资料等
- 已存在,包含完整的用户信息字段
create_activities_table.sql - 活动表 ✨ NEW
- 存储活动核心信息(标题、描述、位置、时间)
- 支持费用类型(免费、付费、AA制、赞助)
- 活动状态管理(草稿、已发布、进行中、已完成、已取消)
create_activity_members_table.sql - 活动成员表 ✨ NEW
- 记录用户参与活动的信息
- 成员角色(创建者、普通成员)
- 加入状态(待审核、已通过、已拒绝、已退出)
聊天模块表
create_chat_rooms_table.sql - 聊天室表 ✨ NEW
- 支持私聊、群聊、活动群聊
- 记录最后消息信息
- 聊天室状态管理
create_chat_members_table.sql - 聊天成员表 ✨ NEW
- 记录聊天室成员信息
- 成员角色(群主、管理员、普通成员)
- 未读消息统计、禁言管理
create_messages_table.sql - 消息表 ✨ NEW
- 支持多种消息类型(文字、图片、语音、视频、系统消息)
- 消息状态跟踪(已发送、已送达、已读、已删除)
- 媒体文件 URL 存储
内容模块表
create_posts_table.sql - 帖子表 ✨ NEW
- 支持多种帖子类型(纯文字、图片、视频、混合)
- 位置标签、话题标签
- 互动统计(点赞、评论、转发、浏览)
- 审核状态管理
create_comments_table.sql - 评论表 ✨ NEW
- 支持评论和回复
- 点赞数、回复数统计
- 评论状态(待审核、已通过、已拒绝、已删除)
create_likes_table.sql - 点赞表 ✨ NEW
- 统一管理帖子和评论的点赞
- 点赞状态(有效、已取消)
- 防止重复点赞
匹配模块表
create_match_requests_table.sql - 搭子匹配请求表 ✨ NEW
- 出行计划信息
- 匹配条件(性别、年龄、兴趣、距离)
- 匹配状态(活跃、暂停、已完成、已取消)
create_match_results_table.sql - 匹配结果表 ✨ NEW
- 匹配分数(0-100)
- 匹配类型(活动搭子、旅行搭子、兴趣搭子)
- 相似度详情、推荐权重
- 匹配状态(待处理、已接受、已拒绝、已过期)
create_user_preferences_table.sql - 用户偏好表 ✨ NEW
- 年龄、性别、地区、兴趣偏好
- 预算、距离偏好
- 智能推荐设置、黑名单管理
create_user_interests_table.sql - 用户兴趣表 ✨ NEW
- 兴趣标签(旅游、爬山、美食、摄影等)
- 兴趣等级(一般、喜欢、热爱)
安全模块表
create_roles_table.sql - 角色表 ✨ NEW
- 角色类型(系统、业务、自定义)
- 角色级别(1-10)
- 权限列表、角色层级
create_user_roles_table.sql - 用户角色关联表 ✨ NEW
- 分配类型(直接、继承、临时)
- 有效期管理
- 撤销记录
create_user_sessions_table.sql - 用户会话表 ✨ NEW
- 访问令牌、刷新令牌
- 设备信息、IP地址
- 会话类型(网页、移动端、接口)
- 会话状态(激活、已过期、已撤销)
系统表
domain_event_record_table.sql - 领域事件记录表
- Transactional Outbox 模式
- 事件发布状态、重试机制
saga_state_table.sql - Saga 状态表
- Saga 执行状态跟踪
- 支持断点续传和故障恢复
wechat_login_migration.sql - 微信登录迁移脚本
- 为用户表添加微信登录字段
🎯 设计规范
命名规范
- 表名:小写 + 下划线,复数形式(如
activities,chat_rooms) - 字段名:小写 + 下划线(如
user_id,created_time) - 索引名:
- 唯一索引:
uk_字段名(如uk_activity_id) - 普通索引:
idx_字段名(如idx_user_id) - 复合索引:
idx_字段1_字段2(如idx_status_start_time)
- 唯一索引:
字段规范
- 主键:
id BIGINT AUTO_INCREMENT- 数据库主键 - 业务主键:
xxx_id VARCHAR(64)- 业务唯一标识,添加唯一索引 - 状态字段:使用
VARCHAR(32)存储枚举值(如ACTIVE,PENDING) - 时间字段:使用
DATETIME类型 - 金额字段:使用
DECIMAL(10, 2)类型 - JSON 字段:使用
JSON类型存储复杂数据
审计字段(标准配置)
`created_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`updated_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',可选审计字段
`created_by` VARCHAR(64) COMMENT '创建者',
`updated_by` VARCHAR(64) COMMENT '更新者',
`version` INT NOT NULL DEFAULT 0 COMMENT '版本号(乐观锁)',索引设计原则
- 唯一索引:业务主键必须添加唯一索引
- 外键索引:关联字段必须添加索引(如
user_id,activity_id) - 状态索引:状态字段添加索引,支持按状态查询
- 时间索引:时间字段添加索引,支持排序和范围查询
- 复合索引:常见查询组合添加复合索引(如
status + created_time)
📊 表关系说明
活动模块
activities (活动表)
├─ activity_members (活动成员表) - 1:N
└─ chat_rooms (聊天室表) - 1:1 (活动群聊)聊天模块
chat_rooms (聊天室表)
├─ chat_members (聊天成员表) - 1:N
└─ messages (消息表) - 1:N内容模块
posts (帖子表)
├─ comments (评论表) - 1:N
└─ likes (点赞表) - 1:N
comments (评论表)
└─ likes (点赞表) - 1:N匹配模块
match_requests (匹配请求表)
└─ match_results (匹配结果表) - 1:N
users (用户表)
├─ user_preferences (用户偏好表) - 1:1
└─ user_interests (用户兴趣表) - 1:N安全模块
roles (角色表)
└─ user_roles (用户角色关联表) - 1:N
users (用户表)
├─ user_roles (用户角色关联表) - 1:N
└─ user_sessions (用户会话表) - 1:N🚀 执行顺序
建议按以下顺序执行 SQL 脚本:
1. 基础表(无外键依赖)
# 用户表
mysql < create_users_table.sql
# 角色表
mysql < create_roles_table.sql2. 关联表
# 用户相关
mysql < create_user_interests_table.sql
mysql < create_user_preferences_table.sql
mysql < create_user_roles_table.sql
mysql < create_user_sessions_table.sql
# 活动相关
mysql < create_activities_table.sql
mysql < create_activity_members_table.sql
# 聊天相关
mysql < create_chat_rooms_table.sql
mysql < create_chat_members_table.sql
mysql < create_messages_table.sql
# 内容相关
mysql < create_posts_table.sql
mysql < create_comments_table.sql
mysql < create_likes_table.sql
# 匹配相关
mysql < create_match_requests_table.sql
mysql < create_match_results_table.sql3. 系统表
# 事件和 Saga
mysql < domain_event_record_table.sql
mysql < saga_state_table.sql📝 注意事项
- 字符集:所有表使用
utf8mb4字符集,支持 emoji 和特殊字符 - 引擎:使用
InnoDB引擎,支持事务和外键 - 排序规则:使用
utf8mb4_unicode_ci排序规则 - JSON 字段:需要 MySQL 5.7.8+ 版本支持
- 索引优化:根据实际查询情况调整索引,避免过多索引影响写入性能
🔧 维护建议
- 定期备份:每天备份数据库
- 监控慢查询:开启慢查询日志,优化慢 SQL
- 索引优化:定期分析索引使用情况,删除无用索引
- 数据归档:定期归档历史数据(如已删除的消息、过期的会话)
- 性能监控:监控表大小、查询性能、锁等待等指标
📚 相关文档
生成时间: 2025-12-31
版本: 1.0
作者: AI Assistant
📊 生成的 SQL 文件汇总
我根据你的 Entity 对象和现有 SQL 规范,共生成了 16 个新的建表 SQL 文件:
🎯 活动模块(2个)
✅ create_activities_table.sql - 活动表
✅ create_activity_members_table.sql - 活动成员表
💬 聊天模块(3个)
✅ create_chat_rooms_table.sql - 聊天室表
✅ create_chat_members_table.sql - 聊天成员表
✅ create_messages_table.sql - 消息表
📝 内容模块(3个)
✅ create_posts_table.sql - 帖子表
✅ create_comments_table.sql - 评论表
✅ create_likes_table.sql - 点赞表
🤝 匹配模块(4个)
✅ create_match_requests_table.sql - 匹配请求表
✅ create_match_results_table.sql - 匹配结果表
✅ create_user_preferences_table.sql - 用户偏好表
✅ create_user_interests_table.sql - 用户兴趣表
🔐 安全模块(3个)
✅ create_roles_table.sql - 角色表
✅ create_user_roles_table.sql - 用户角色关联表
✅ create_user_sessions_table.sql - 用户会话表
📚 文档(1个)
- ✅ README.md - 完整的说明文档
🎨 设计亮点
1. 严格遵循现有规范
字符集:utf8mb4 + utf8mb4_unicode_ci
引擎:InnoDB
时间字段:DATETIME + 自动更新
注释:每个字段都有详细的中文注释
2. 完善的索引设计
业务主键唯一索引(uk_xxx_id)
外键关联索引(idx_user_id, idx_activity_id)
状态查询索引(idx_status)
时间排序索引(idx_created_time)
复合索引(idx_status_created_time)
3. DDD 领域模型映射
完全对应你的 Entity 对象字段
保留了值对象的扁平化存储(如 Location → location_name, location_latitude)
JSON 字段存储复杂数据(tags, permissions, attributes)
4. 业务状态管理
活动状态:DRAFT → PUBLISHED → IN_PROGRESS → COMPLETED/CANCELLED
消息状态:SENT → DELIVERED → READ
匹配状态:PENDING → ACCEPTED/REJECTED/EXPIRED
会话状态:ACTIVE → EXPIRED/REVOKED
5. 审计和版本控制
标准审计字段:created_time, updated_time
可选审计字段:created_by, updated_by
乐观锁:version 字段(部分表)
🚀 使用建议
按顺序执行:先执行基础表(users, roles),再执行关联表
检查字段:根据实际业务需求调整字段长度和类型
索引优化:上线后根据慢查询日志优化索引
数据迁移:如果已有数据,需要编写迁移脚本